/**
 * 
 */
package com.peycash.servicio.impl;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import com.peycash.common.EstatusCliente;
import com.peycash.common.TipoCliente;
import com.peycash.common.dto.ClienteDTO;
import com.peycash.common.dto.ClienteRegistroDTO;
import com.peycash.dominio.Cliente;
import com.peycash.dominio.EstadosCliente;
import com.peycash.persistencia.PersistenciaException;
import com.peycash.persistencia.dao.ClienteDAO;
import com.peycash.servicio.ClienteServicio;
import com.peycash.servicio.ServicioException;

/**
 * @author JAMARO
 *
 */
@Service
public class ClienteServicioImpl implements ClienteServicio {

	@Autowired
	private ClienteDAO daoCliente;
	
	@Override
	@Transactional
	public void bajaTemporal(ClienteRegistroDTO dto) throws ServicioException{
		try{
			Cliente cliente = daoCliente.findByPK(dto.getIdCliente());
			cliente.setComentarios(dto.getComentarios());
			cliente.setFechaModif(dto.getFechaModif());
			cliente.setFechaBaja(dto.getFechaBaja());
			cliente.setUsuarioBd(dto.getUsuarioBd());
			EstadosCliente e = new EstadosCliente();
			e.setIdEstadoCliente((byte) 2);
			cliente.setEstadosCliente(e);
		}catch(PersistenciaException e){
			throw new ServicioException("Error en bajaTemporal:"+e.getMessage(), e);
		}
	}
	
	@Override
	@Transactional
	public void llamarDespuesCliente(ClienteRegistroDTO dto) throws ServicioException{
		try{
			Cliente cliente = daoCliente.findByPK(dto.getIdCliente());
			cliente.setNumCel(dto.getNumCel());
			cliente.setFechaModif(new Date());
			cliente.setComentarios(dto.getComentarios());
			cliente.setUsuarioBd(dto.getUsuarioBd());
			Integer llamadas = cliente.getLlamadas();
			if(llamadas == null || llamadas == 0){
				cliente.setLlamadas(1);
			}else{
				llamadas++;
				cliente.setLlamadas(llamadas);
			}
			daoCliente.update(cliente);
		}catch(PersistenciaException e){
			throw new ServicioException("Error en llamarDespuesCliente:"+e.getMessage(), e);
		}
	}
	
	@Override
	@Transactional
	public BigDecimal saveCliente(ClienteRegistroDTO dto) throws ServicioException{
		try{
			Cliente cliente = daoCliente.findByPK(dto.getIdCliente());
			cliente.setApellidoMaterno(dto.getApellidoMaterno());
			cliente.setApellidoPaterno(dto.getApellidoPaterno());
			cliente.setComentarios(dto.getComentarios());
			cliente.setCompania(dto.getCompania());
			cliente.setFechaAlta(new Date());
			cliente.setFechaNacimiento(dto.getFechaNacimiento());
			cliente.setIdDomicilio(dto.getIdDomicilio());
			cliente.setIdentificacion(dto.getIdentificacion());
			cliente.setIdTipoIdentificacion(dto.getIdTipoIdentificacion());
			cliente.setNombre(dto.getNombre());
			cliente.setNumCel(dto.getNumCel());
			cliente.setOcupacion(dto.getOcupacion());
			cliente.setSexo(dto.getSexo());
			cliente.setUsuarioBd(dto.getUsuarioBd());
			cliente.setIdCliente(dto.getIdCliente());
			EstadosCliente estado = new EstadosCliente();
			estado.setIdEstadoCliente((byte) 1);
			cliente.setEstadosCliente(estado);
			daoCliente.update(cliente);
			return cliente.getIdCliente();
		}catch(PersistenciaException e){
			throw new ServicioException("Error en saveCliente:"+e.getMessage(), e);
		}
	}
	
	@Override
	@Transactional(readOnly=true)
	public Cliente findById(BigDecimal id) throws ServicioException{
		try{
			Cliente cliente = daoCliente.findByPK(id);
			return cliente;
		}catch(PersistenciaException e){
			throw new ServicioException("Error en findById:"+e.getMessage(), e);
		}
	}
	
	@Override
	@Transactional
	public void updateCliente(Cliente cliente) throws ServicioException{
		try{
			daoCliente.update(cliente);
		}catch(PersistenciaException e){
			throw new ServicioException("Error en updateCliente:"+e.getMessage(), e);
		}
	}
	
	@Override
	@Transactional(readOnly=true)
	public List<ClienteDTO> findClientesPendientes() throws ServicioException{
		try{
			List<ClienteDTO> listDTO = new ArrayList<ClienteDTO>();
			List<Cliente> listPendientes = daoCliente.findClientesPendientes();
			for(Cliente cliente : listPendientes){
				ClienteDTO dto = new ClienteDTO();
				dto.setEstatus(EstatusCliente.NUEVO);
				dto.setIdCliente(cliente.getIdCliente());
				dto.setNoCel(cliente.getNumCel());
				dto.setLlamadas(cliente.getLlamadas());
				listDTO.add(dto);
			}
			return listDTO;
		}catch(PersistenciaException e){
			throw new ServicioException("Error en findClientesPendientes:"+e.getMessage(), e);
		}
	}
	
	@Override
	@Transactional(readOnly=true)
	public List<ClienteDTO> findClientesPendientesPorSistema() throws ServicioException{
		try{
			List<ClienteDTO> listDTO = new ArrayList<ClienteDTO>();
			List<Cliente> listPendientes = daoCliente.findClientesPendientesPorSistema();
			for(Cliente cliente : listPendientes){
				ClienteDTO dto = new ClienteDTO();
				dto.setEstatus(EstatusCliente.NUEVO);
				dto.setIdCliente(cliente.getIdCliente());
				dto.setNoCel(cliente.getNumCel());
				dto.setTipoCliente(TipoCliente.ENVIA);
				dto.setLlamadas(cliente.getLlamadas());
				listDTO.add(dto);
			}
			return listDTO;
		}catch(PersistenciaException e){
			throw new ServicioException("Error en findClientesPendientesPorSistema:"+e.getMessage(), e);
		}
	}
	
	@Override
	@Transactional(readOnly=true)
	public BigDecimal findId(String noCel) throws ServicioException{
		try{
			BigDecimal id = daoCliente.findId(noCel);
			return id;
		}catch(PersistenciaException e){
			throw new ServicioException("Error en findId:"+e.getMessage(), e);
		}
	}
}
